查看原文
其他

.NET Core 中正确使用 HttpClient 的姿势

DotNet 2019-08-03

(给DotNet加星标,提升.Net技能


转自:Liam Wang

cnblogs.com/willick/p/net-core-httpclient.html



一、直接使用方式


不管是哪种方式,都要先注册服务,对于 ASP.NET Core 应用则是在 Startup.cs 文件的 ConfigureServices 添加如果代码:


services.AddHttpClient();


然后在 Controller 中通过构造注入的试获得 IHttpClientFactory,然后通过它来创建 HttpClient 对象。示例代码:


public class ValuesController : BaseController
{
   private readonly IHttpClientFactory _httpClientFactory;
   public ValuesController(IHttpClientFactory httpClientFactory)
   
{
       _httpClientFactory = httpClientFactory;
   }
   [HttpGet]
   public async Task<ActionResult> Get()
   
{
       var client = _httpClientFactory.CreateClient();
       client.BaseAddress = new Uri("http://api.github.com");
       string result = await client.GetStringAsync("/");
       return Ok(result);
   }
}



services.AddHttpClient();
services.AddHttpClient("github", c =>
{
   c.BaseAddress = new Uri("https://api.github.com/");
   c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
   c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});


注意这里添加了两次 AddHttpClient,一次是没有命名的,一次是有命名的。在 Controller 中的使用方式是:


public class ValuesController : BaseController
{
   private readonly IHttpClientFactory _httpClientFactory;
   public ValuesController(IHttpClientFactory httpClientFactory)
   
{
       _httpClientFactory = httpClientFactory;
   }
   [HttpGet]
   public async Task<ActionResult> Get()
   
{
       var client = _httpClientFactory.CreateClient("github");
       string result = await client.GetStringAsync("/");
       return Ok(result);
   }
}



public class GitHubClient
{
   public HttpClient Client { get; private set; }
   public GitHubClient(HttpClient httpClient)
   
{
       httpClient.BaseAddress = new Uri("https://api.github.com/");
       httpClient.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
       httpClient.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
       Client = httpClient;
   }
   public async Task<string> GetData()
   
{
       return await _client.GetStringAsync("/");
   }
}


这里的 GetData 就是额外扩展的共用方法。使用前需要为这个类注册服务:


services.AddHttpClient<GitHubClient>();


然后在需要的地方(比如 Controller)中这样使用:


public class ValuesController : BaseController
{
   private readonly GitHubClient _gitHubClient;;
   public ValuesController(GitHubClient gitHubClient)
   
{
       _gitHubClient = gitHubClient;
   }
   [HttpGet]
   public async Task<ActionResult> Get()
   
{
       string result = await _gitHubClient.GetData();
       return Ok(result);
   }
}


类型化的方式和命名式的方式相比,虽然在配置的时候会麻烦一点,但它有两个好处:


一是不用通过名称字符串来获得 Client,而是直接通过依赖注入获得具体的 Client;


二是可以在自定义的 HttpClient 类中扩展共用的方法。


推荐阅读

(点击标题可跳转阅读)

.NET Core部署中你不了解的框架依赖与独立部署

ASP.NET Core依赖注入和管道方式的异常处理及日志记录

ASP.NET Core Jenkins Docker 实现一键化部署


看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存